#include<iostream>
using namespace std;
const int N=1e5+10;
int f[N],len;
int a[N];
//这个方法只适用于只求解最长严格上升子系列长度的题
//f数组只从满足最长上升长度为len的子序列的所有子序列的最小的那个最后一个数
int main()
{
    int n=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        //处理边界情况
        //如果这个数更大的话那说明可以形成更长的上升子序列
        if(len==0||a[i]>f[len]) f[++len]=a[i];
        else
        {
            //如果没办法形成更长的上升子序列就想办法找着这个值应该放在哪
            //应该放在大于他的那个值的地方、因为他可以形成那个长度的序列并且更小，意味着以后有机会能形成更长的序列
            int l=1,r=len;
            while(l<r)
            {
                int mid=(l+r)/2;
                if(f[mid]>=a[i]) r=mid;
                else l=mid+1;
            }
            f[l]=a[i];
        }
        
    }
    cout<<len<<endl;
    return 0;
}